package com.leil.java8.闭包;

import java.util.function.IntSupplier;

public class Closure {

    static int i = 0;
    static IntSupplier closure1() {
        return () -> i++;
    }

    static IntSupplier closure2(int x) {
        // i和x都是局部变量，调用完closure2之后就会消失，闭包存储当前状态于返回的函数中，所以不能在函数中改变
        int i = 0;      // 等同final的效果
//        final int i = 0;    // 这里和上面效果相同
//        return () -> i++;   // 编译会报错，i必须是final的，不能改变
        return () -> x + i;
    }

    public static void main(String[] args) {
        // 1、共享变量
        IntSupplier fun1 = closure1();
        IntSupplier fun2 = closure1();
        IntSupplier fun3 = closure1();
        System.out.println(fun1.getAsInt());    // 输出0
        System.out.println(fun2.getAsInt());    // 输出1
        System.out.println(fun3.getAsInt());    // 输出2
        // 多个函数共享i的存储空间，将对象绑定到函数上

        // 2、局部变量封存
        IntSupplier fun = closure2(100);
        System.out.println(fun.getAsInt());
    }



}
